#include "BlockedFile.h"

BlockedFile::BlockedFile() {
	this->nombre = "";
	this->tamBloque = 0;
	this->tipoApertura = ABRIR;
	this->error = false;
}

BlockedFile::BlockedFile(string path, enum TipoAperturaArchivo apertura, int tamanioBloque) {
	init(path, apertura, tamanioBloque);
}

BlockedFile::~BlockedFile() {
	close();
}

bool BlockedFile::init(string path, TipoAperturaArchivo apertura, int tamanioBloque) {
	this->nombre = path;
	this->tamBloque = tamanioBloque;
	this->tipoApertura = apertura;
	this->error = false;
	switch(this->tipoApertura) {
	case CREAR:
		this->flujo.open(this->nombre.c_str(), ios_base::in|ios_base::out|ios_base::binary|ios_base::trunc);
		break;
	case ABRIR:
		this->flujo.open(this->nombre.c_str(), ios_base::in|ios_base::out|ios_base::binary);
		break;
	default:
		this->error = true;
		break;
	}
	if ((!this->flujo)||(!this->flujo.good())||(this->flujo.bad()))
		this->error = true;
	return !this->error;
}

void BlockedFile::close() {
	if (this->flujo.is_open())
		this->flujo.close();
}

char* BlockedFile::readBloque(int numeroBloque) {
	char* buffer = (char*)malloc(this->tamBloque);
	memset(buffer,0,this->tamBloque);
	this->flujo.seekg((this->tamBloque)*numeroBloque);
	this->flujo.read(buffer, this->tamBloque);
	return buffer;
}

void BlockedFile::writeBloque(int numeroBloque, char* bloque) {
	this->flujo.seekp((this->tamBloque)*numeroBloque);
	this->flujo.write(bloque,this->tamBloque);
	this->flujo.flush();
}

int BlockedFile::getCantBloques() {
	this->flujo.seekg(0, ios_base::end);
	int length = this->flujo.tellg();
	return (length/this->tamBloque);
}

char* BlockedFile::readDatos(int posicionLectura,int sizeLectura)
{
	char* buffer = (char*)malloc(sizeLectura);
	memset(buffer,0,sizeLectura);
	this->flujo.seekg(posicionLectura);
	this->flujo.read(buffer, sizeLectura);
	return buffer;
}

void BlockedFile::writeDatos(int posicionEscritura, int sizeEscritura, char* dato)
{
	this->flujo.seekp(posicionEscritura);
	this->flujo.write(dato,sizeEscritura);
	this->flujo.flush();
}
